home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / util / snap_1_4 / part01 / source / clip.c next >
C/C++ Source or Header  |  1990-02-11  |  3KB  |  90 lines

  1. /* This is just plain clipboard handling */
  2.  
  3. IMPORT struct IOClipReq *ClipReq;
  4.  
  5. ULONG ReadClip(ClipReq, Buf, BufSize, Action)
  6. struct IOClipReq *ClipReq;
  7. STRPTR Buf;
  8. ULONG BufSize;
  9. SHORT Action;
  10. {
  11.     ULONG Length;
  12.     ClipReq->io_Command = CMD_READ;
  13.     ClipReq->io_Data = Buf;
  14.     ClipReq->io_Length = BufSize-1L;       /* space for '\0' */
  15.     if (Action == CLIP_FIRST) {
  16.         ClipReq->io_Offset = 0L;
  17.         ClipReq->io_ClipID = 0L;
  18.     }
  19.     DoIO(ClipReq);
  20.     Length = ClipReq->io_Actual;
  21.     Buf[Length] = '\0';
  22.     if (Action == CLIP_LAST) {
  23.         ClipReq->io_Command = CMD_READ;
  24.         ClipReq->io_Data = NULL;
  25.         ClipReq->io_Length = 1L;
  26.         DoIO(ClipReq);                    /* Null read to terminate */
  27.     }
  28.     return(Length);
  29. }
  30.  
  31. VOID WriteClip(ClipReq, Buf, BufSize, Action)
  32. struct IOClipReq *ClipReq;
  33. STRPTR Buf;
  34. ULONG BufSize;
  35. SHORT Action;
  36. {
  37.     if (Action == CLIP_FIRST) {
  38.         ClipReq->io_Offset = 0L;
  39.         ClipReq->io_ClipID = 0L;
  40.     }
  41.     ClipReq->io_Command = CMD_WRITE;
  42.     ClipReq->io_Data = Buf;
  43.     ClipReq->io_Length = BufSize;
  44.     DoIO(ClipReq);
  45.     if (Action == CLIP_LAST) {
  46.         ClipReq->io_Command = CMD_UPDATE;
  47.         DoIO(ClipReq);
  48.     }
  49. }
  50.  
  51. VOID SaveClip(SnapSpace, SnapSize)
  52. UBYTE *SnapSpace;
  53. ULONG SnapSize;
  54. {
  55.     ULONG Len;
  56.     WriteClip(ClipReq, "FORM", 4L, CLIP_FIRST);
  57.     Len = SnapSize+12;
  58.     WriteClip(ClipReq, (STRPTR)&Len, 4L, CLIP_CONT);
  59.     WriteClip(ClipReq, "FTXT", 4L, CLIP_CONT);
  60.     WriteClip(ClipReq, "CHRS", 4L, CLIP_CONT);
  61.     Len = SnapSize;
  62.     WriteClip(ClipReq, (STRPTR)&Len, 4L, CLIP_CONT);
  63.     WriteClip(ClipReq, SnapSpace, Len, CLIP_LAST);
  64. }
  65.  
  66. struct Snap *FetchClip()
  67. {
  68.     struct Snap *Snap = NULL;
  69.     ULONG temp;
  70.     ULONG ID[2];
  71.  
  72.     (VOID)ReadClip(ClipReq, (STRPTR)&ID, 5L, CLIP_FIRST);    /* FORM */
  73.     if (!strcmp((STRPTR)&ID, "FORM")) {
  74.         (VOID)ReadClip(ClipReq, (STRPTR)&ID, 5L, CLIP_CONT);     /* size */
  75.         (VOID)ReadClip(ClipReq, (STRPTR)&ID, 5L, CLIP_CONT);     /* FTXT */
  76.         if (!strcmp((STRPTR)&ID, "FTXT")) {
  77.             (VOID)ReadClip(ClipReq, (STRPTR)&ID, 5L, CLIP_CONT);     /* CHRS */
  78.             if (!strcmp((STRPTR)&ID, "CHRS")) {
  79.                 (VOID)ReadClip(ClipReq, (STRPTR)&ID, 5L, CLIP_CONT); /* #chars */
  80.                 temp = ID[0];
  81.                 Snap = AllocMem((LONG)sizeof(struct Snap)+temp,
  82.                   MEMF_PUBLIC|MEMF_CLEAR);
  83.                 Snap->Size = sizeof(struct Snap)+temp;
  84.                 ReadClip(ClipReq, &Snap->Chars[0], Snap->Size+1L, CLIP_LAST);
  85.             }
  86.         }
  87.     }
  88.     return(Snap);
  89. }
  90.